#include "apue.h"
#include <errno.h>

void pr_mask(const char *str) {
    sigset_t sigset;
    int errno_save;

    errno_save= errno;
    if (sigprocmask(SIG_BLOCK, NULL, &sigset) < 0) 
        err_sys("sigprocmask error");
    else {
        printf("%s", str);
        if (sigismember(&sigset, SIGINT))
            printf(" SIGINT");
        if (sigismember(&sigset, SIGQUIT))
            printf(" SIGQUIT");
        if (sigismember(&sigset, SIGUSR1))
            printf(" SIGUSR1");
        if (sigismember(&sigset, SIGUSR2))
            printf(" SIGUSR2");
        if (sigismember(&sigset, SIGALRM))
            printf(" SIGALRM");
        if (sigismember(&sigset, SIGABRT))
            printf(" SIGABRT");
        if (sigismember(&sigset, SIGBUS))
            printf(" SIGBUS");
#ifdef SIGCANCEL
        if (sigismember(&sigset, SIGCANCEL))
            printf(" SIGCANCEL");
#endif
        if (sigismember(&sigset, SIGCHLD))
            printf(" SIGCHLD");
        if (sigismember(&sigset, SIGCONT))
            printf(" SIGCONT");
#ifdef SIGEMT
        if (sigismember(&sigset, SIGEMT))
            printf(" SIGEMT");
#endif
        if (sigismember(&sigset, SIGFPE))
            printf(" SIGFPE");
#ifdef SIGFREEZE
        if (sigismember(&sigset, SIGFREEZE))
            printf(" SIGFREEZE");
#endif
        if (sigismember(&sigset, SIGHUP))
            printf(" SIGHUP");
        if (sigismember(&sigset, SIGILL))
            printf(" SIGILL");
#ifdef SIGINFO
        if (sigismember(&sigset, SIGINFO))
            printf(" SIGINFO");
#endif
        if (sigismember(&sigset, SIGIO))
            printf(" SIGIO");
        if (sigismember(&sigset, SIGIOT))
            printf(" SIGIOT");
#ifdef SIGJVM1
        if (sigismember(&sigset, SIGJVM1))
            printf(" SIGJUM1");
#endif
        /*
         * SIGKILL 无法被捕获或阻塞
         */
        if (sigismember(&sigset, SIGKILL))
            printf(" SIGKILL");
        if (sigismember(&sigset, SIGPIPE)) 
            printf(" SIGPIPE");
#ifdef SIGPOLL
        if (sigismember(&sigset, SIGPOLL))
            printf(" SIGPOLL");
#endif
        /**
         * SIGSTOP 无法被捕获或阻塞
         */
        if (sigismember(&sigset, SIGSTOP))
            printf(" SIGSTOP");
        if (sigismember(&sigset, SIGSYS))
            printf(" SIGSYS");
        if (sigismember(&sigset, SIGTERM))
            printf(" SIGTERM");
#ifdef SIGTHR
        if (sigismember(&sigset, SIGTHR))
            printf(" SIGTHR");
#endif
        if (sigismember(&sigset, SIGTRAP))
            printf(" SIGTRAP");
        if (sigismember(&sigset, SIGTSTP))
            printf(" SIGTSTP");
        if (sigismember(&sigset, SIGTTIN))
            printf(" SIGTTIN" );
        if (sigismember(&sigset, SIGTTOU))
            printf(" SIGTTOU");
        if (sigismember(&sigset, SIGURG))
            printf(" SIGURG");
        if (sigismember(&sigset, SIGVTALRM))
            printf(" SIGVTALRM");
        if (sigismember(&sigset, SIGWINCH))
            printf(" SIGWINCH");
        if (sigismember(&sigset, SIGXCPU))
            printf(" SIGXCPU");
        if (sigismember(&sigset, SIGXFSZ))
            printf(" SIGXFSZ");
#ifdef SIGXRES
        if (sigismember(&sigset, SIGXRES))
            printf(" SIGXRES");
#endif


        printf("\n");
    }
    errno= errno_save;

}

int main(void) {
    sigset_t mask;
    sigemptyset(&mask);
    sigaddset(&mask, SIGKILL);
    sigaddset(&mask, SIGXCPU);
    sigaddset(&mask, SIGURG);
    sigaddset(&mask, SIGINT);
    sigaddset(&mask, SIGUSR1);
    sigaddset(&mask, SIGPIPE);
    sigaddset(&mask, SIGSTOP);
    sigaddset(&mask, SIGTTOU);

    if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0)
        printf("SIG_BLOCK error\n");

    pr_mask("process sign");
}

